package com.xpq.ddns;

import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Slf4j
public class IpUtil {

    /**
     * 获取当前主机的公网ipv6地址
     *
     * @return ipv6地址字符串
     */
//    public static String getIpv6() {
//        // 主机所有的ip地址
//        InetAddress[] ips = new InetAddress[0];
//        try {
//            String hostName = InetAddress.getLocalHost().getHostName();
//            log.info("当前主机名称：{}", hostName);
//            ips = InetAddress.getAllByName(hostName);
//        } catch (UnknownHostException e) {
//            log.error("无法获取主机名。");
//            e.printStackTrace();
//        }
//
//        // 只获取一个公网ipv6地址
//        for (int i = 0; i < ips.length ; i++) {
//            String originalHostAddress = ips[i].getHostAddress();
//            String hostAddress = originalHostAddress.split("%")[0];
//
//            if("2409".equals(hostAddress.substring(0,4))) { // 移动
//                log.info("获取到中国移动IPv6地址：{}", hostAddress);
//                return hostAddress;
//            }else if ("240e".equals(hostAddress.substring(0,4))) { // 电信
//                log.info("获取到中国电信IPv6地址：{}", hostAddress);
//                return hostAddress;
//            }else if ("2408".equals(hostAddress.substring(0,4))) { // 联通
//                log.info("获取到中国联通IPv6地址：{}", hostAddress);
//                return hostAddress;
//            }
//        }
//
//        log.error("获取公网IPv6地址失败！！！！！！！");
//        throw new RuntimeException("获取公网IPv6地址失败！！！！！！！");
//    }
    public static String getIpv6() {
        String publicIPv6 = IPv6Util.getPublicIPv6Address();
        if (publicIPv6 != null) {
            log.info("获取到的公网IPv6地址为：{}", publicIPv6);
            return publicIPv6;
        } else {
            log.error("获取公网IPv6地址失败！！！！！！！");
            throw new RuntimeException("获取公网IPv6地址失败！！！！！！！");
        }
    }

    /**
     * 获取自己局域网对应的公网ipv4地址，该函数不一定能获取到公网ipv4地址，就算能获取到，这个公网ip大概率也不是你的
     *
     * @return ipv4地址字符串
     */
    public static String getIpv4() {
        // 这里使用jsonip.com第三方接口获取本地IP
        String jsonip = "https://jsonip.com/";
        // 接口返回结果
        String result = "";
        BufferedReader in = null;
        try {
            // 使用HttpURLConnection网络请求第三方接口
            URL url = new URL(jsonip);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.connect();
            in = new BufferedReader(new InputStreamReader(
                    urlConnection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        // 正则表达式，提取xxx.xxx.xxx.xxx，将IP地址从接口返回结果中提取出来
        String rexp = "(\\d{1,3}\\.){3}\\d{1,3}";
        Pattern pat = Pattern.compile(rexp);
        Matcher mat = pat.matcher(result);
        String res = "";
        while (mat.find()) {
            res = mat.group();
            break;
        }

        if ("".equals(res)) {
            log.error("获取公网IPv4地址失败！！！！！！！！！");
            throw new RuntimeException("获取公网IPv4地址失败！！！！！！！！！");
        }
        log.info("获取到公网ipv4地址：{}", res);
        return res;
    }
}
